/**
 * @author Stephan Pfaff (webmaster@derdaumen.net)
 */

/**
 * ItemContainer Klasse
 * @param type 		String - Typ des ItemContainers (preface, category, project oder button)
 * @param prefix 	String - Prefix der MySQL Datensätze die mit dem Containertyp verknüpft sind 
 * @param urlLoad 	String - URL des php Script welches die Inhalte des Containers liefert
 */
function ItemContainer(type, prefix, urlLoad) {
	try {
		this.type = type;
		this.prefix = prefix;
		this.urlLoad = urlLoad;
		this.items = null;
		if(this.type == 'preface')
			this.div_class = 'preface';
		else if(this.type == 'category')
			this.div_class = 'nav nav_horizontal';
		else if(this.type == 'project')
			this.div_class = 'nav nav_vertical';
		else if(this.type == 'button')
			this.div_class = 'content';

		var itemID = type+'Container';
		this.$div = $('#'+itemID);
		if (!this.$div.length && noPHPMode) {
			$('#main').append('<div id="'+itemID+'" class="'+this.div_class+'" style="display: none;"></div>');
			this.$div = $('#'+itemID);
		}
		
		if (this.type == 'project') {
			var handle = this;
			this.$div.mousemove(function(e){
				handle.scroll(e);
			});
		}
	} catch(e) {
		if(debug) alert('Initialization of Preface failed, missing or wrong parameter! ('+e+')');
	}
};
/**
 * Typ des ItemContainers (preface, category, project oder button)
 */
ItemContainer.prototype.type = null;
/**
 * Prefix der MySQL Datensätze die mit dem Containertyp verknüpft sind
 */
ItemContainer.prototype.prefix = null;
/**
 * URL des php Script welches die Inhalte des Containers liefert
 */
ItemContainer.prototype.urlLoad = null;
/**
 * Objekt das die Inhalte des ItemContainers enthält
 */
ItemContainer.prototype.items = null;
/**
 * Das JQuery Objekt des DIVs welches den ItemContainer repräsentiert
 */
ItemContainer.prototype.$div = null;
/**
 * Der Klassename des Container DIVs
 */
ItemContainer.prototype.div_class = null;
/**
 * Der Wrapper für die Scrollfunktion
 */
ItemContainer.prototype.$scrollWrapper = null;

/**
 * Berechnet die Anzahl an Inhalt Elementen im Container
 * @return int - Anzahl der Inhalt Elemente
 */
ItemContainer.prototype.length = function(){
	if (this.items != null) {
		var i = 0;
		for (key in this.items) {
			i++;
		}
		return i;
	} else {
		return -1;
	}
};
/**
 * Löscht alle HTML Elemente im Container-DIV
 * @return void
 */
ItemContainer.prototype.clear = function() {
	this.$div.empty();
};
/**
 * Erstellt Item Objekte aus den geladenen Daten (Category, Project oder Button) und zeigt das Content Grid an
 * @param items_temp 	Object - die geladenen MySQL Datensätze
 * @param params 		Object - Parameter Objekt: {prefix, ctg_id und prj_id} 
 * @param autoSelect	Boolean - Gibt an ob automatisch ein Inhalt-Element ausgewählt werden soll
 * @return
 */
ItemContainer.prototype.createItems = function(items_temp, params, autoSelect) {
	if(noPHPMode) {
		this.clear();
		if(this.type == 'button' || this.type == 'preface')
			var btn_coords = new Array();
	}
	var interactive = new Boolean(true);
	var i = 0;
	for(key in items_temp) {
		var item = items_temp[key];
		//Die geladenen Objekte erstellen und in items speichern
		switch (this.type) {
		case 'preface':
			if(item.type == 'category') {
				this.items[key] = new Category(item, params, this);
				if(noPHPMode) btn_coords.push(""+item.start_x+""+item.start_y);
			} else if(item.type == 'button'){
				this.items[key] = new Button(item, params, this);
				if(noPHPMode) btn_coords.push(""+item.x+""+item.y);
			}
			break;
		case 'category':
			if(i == 0 && params.ctg_id == null && autoSelect) params.ctg_id = key;
			this.items[key] = new Category(item, params, this);
			break;
		case 'project':
			if(i == 0 && params.prj_id == null && autoSelect) params.prj_id = key;
			this.items[key] = new Project(item, params, this);
			break;
		case 'button':
			if(i == 0 && params.btn_id == null && autoSelect) params.btn_id = key;
			this.items[key] = new Button(item, params, this);
			if(noPHPMode) btn_coords.push(""+item.x+""+item.y);
			interactive = new Boolean(item.interactive);
			break;
		}
		i++;
	}
	if(this.type == 'button' || this.type == 'preface') {
		if(noPHPMode){
			var dummies = ["<div id='dummies'>"];
			var max_x = site.grid_w;
			if (this.type == 'preface')
				var max_y = site.grid_h+1;
			else
				var max_y = site.grid_h;
			for(var x=0; x < max_x; x++) {
				for(var y=0; y < max_y; y++) {
					var left = x*site.gridSize;
					var top = y*site.gridSize;
					if($.inArray(""+x+""+y, btn_coords) < 0) {
						dummies.push("<div id='dummy_"+x+""+y+"' class='dummy item' style='left: "+left+"px; top: "+top+"px;'></div>\n");
					}
				}
			}
			dummies.push("</div>");
			this.$div.append(dummies.join(''));
			$('.dummy').draggable({
				revert: true,
				revertDuration: site.navAnimationDuration
			});
		}
	}
	if(noPHPMode)
		this.$div.fadeIn(site.containerFadeDuration);
};
/**
 * Lädt Item-Daten aus der Datenbank, instanziiert damit Item-Objekte
 * die im Item-Container-Objekt gespeichert und anschließend angezeigt werden.
 * 
 * @param params 		Parameter Objekt: {prefix, ctg_id und prj_id}
 * @param preSelection	ID des Items das nach dem laden ausgewählt werden soll.
 * @param autoselect	Automatische auswahl des ersten Items wenn true
 * @return
 */
ItemContainer.prototype.load = function(params, autoSelect) {
	if(params) {
		if(noPHPMode && fadeContent) {
			this.$div.hide();
		}
		if (this.type == 'project')
			this.$div.scrollTop(0);
		if(this.type == 'preface') {
			params.prefix = 'ctg';
			this.items = new Object();
			var handle = this;
			$.getJSON(this.urlLoad, params, function(response){
				//wenn anfrage erfolgreich und items nicht leer
				if(response.result && response.items != null) {
					var items_temp = response.items;
					params.prefix = 'btn';
					params.ctg_id = 0;
					$.getJSON(handle.urlLoad, params, function(response){
						//wenn anfrage erfolgreich und items nicht leer
						if(response.result && response.items != null) {
							var items_temp2 = response.items;
							for(key in items_temp2) {
								items_temp['btn'+key] = items_temp2[key];
							}
							handle.createItems(items_temp, params, autoSelect);
						} else {
							if(debug) alert('load ' + handle.type + ' failed:\n'
									+ 'error: ' +response.error +"\n"
									+ 'items: ' +response.items +"\n"
									+ 'itemContainer: ' +(handle.$div.length > 0));
						}
					});
				} else {
					if(debug) alert('load ' + handle.type + ' failed:\n'
							+ 'error: ' +response.error +"\n"
							+ 'items: ' +response.items +"\n"
							+ 'itemContainer: ' +(handle.$div.length > 0));
				}
			});
		} else {
			params.prefix = this.prefix;
			this.items = new Object();
			var handle = this;
			$.getJSON(this.urlLoad, params, function(response){
				//wenn anfrage erfolgreich und items nicht leer
				if(response.result && response.items != null) {
					handle.createItems(response.items, params, autoSelect);
				} else {
					if(debug) alert('load ' + handle.type + ' failed:\n'
							+ 'error: ' +response.error +"\n"
							+ 'items: ' +response.items +"\n"
							+ 'itemContainer: ' +(handle.$div.length > 0));
				}
			});
		}
	} else {
		if(debug) alert("Fehlende Parameter für load"+this.type+"()!");
	}
};

/**
 * Scrollt MenuContainer wenn er mehr Menü Items enthält als darstellbar sind
 * 
 * @param e eventHandler des mousmove listeners
 * @return void
 */
ItemContainer.prototype.scroll = function(e) {
	var menuHeight = this.length()*site.gridSize;
	var areaHeight = this.$div.height();
	var threshold = 20;
	var y_step = (e.pageY - this.$div.offset().top - threshold) * (menuHeight - areaHeight + (areaHeight/threshold)) / areaHeight;
	this.$div.scrollTop(y_step);
};